import axios from 'axios'
// import { MessageBox, Message } from 'element-ui'
import { Message } from 'element-ui'
import store from '@/store'
// import { getToken } from '@/utils/auth'
import router from '@/router'
import { getTimeStamp } from '@/utils/auth'
// token超时失效值,单位秒
const TimeOut = 3600

const service = axios.create({
  // 如果执行 npm run dev  值为 /api 正确  /api 这个代理只是给开发环境配置的代理
  // 如果执行 npm run build 值为 /prod-api  没关系  运维应该在上线的时候 给你配置上 /prod-api的代理
  baseURL: process.env.VUE_APP_BASE_API, // 设置axios请求的基础的基础地址
  timeout: 5000 // 定义5秒超时
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // do something before request is sent

    if (store.getters.token) {
      // token失效则清除token等个人信息并且跳到登录页
      if (IsCheckTimeOut()) {
        store.dispatch('user/logout')
        router.push('/login')
        return Promise.reject(new Error('token已失效'))
      }
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['Authorization'] = `Bearer ${store.getters.token}`
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  // 响应成功
  response => {
    // 解构一层data，方便后续调用
    const { success, message, data } = response.data
    if (success) {
      // 直接返回解构后的数据
      return data
    } else {
      // 弹错误提示
      Message.error(message)
      return Promise.reject(new Error(message))
    }
  },
  error => {
    // 当服务端通知token失效时，删除token和个人信息,error.response.data.code得知token是否失效
    if (error.response && error.response.data && error.response.data.code === 10002) {
      store.dispatch('user/logout')
      router.push('/login')
    } else {
      // 弹错误提示
      Message.error(error.message)
    }
    // 返回错误对象
    return Promise.reject(error)
  }
)

// 计算token是否失效
function IsCheckTimeOut() {
  // 当前时间戳-之前存入token的时间戳
  return (Date.now() - getTimeStamp()) / 1000 > TimeOut
}

export default service
